package ve.com.neometrica.inventario.web.bean;

import java.io.Serializable;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Iterator;
import java.util.MissingResourceException;
import java.util.ResourceBundle;

import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;

import org.apache.log4j.Logger;



import ar.com.excle.commons.web.bean.MultipleModeContainerBean;
import ar.com.excle.commons.web.faces.UtilFaces;
import ve.com.neometrica.inventario.api.model.Destino;
import ve.com.neometrica.inventario.api.model.Marca;
import ve.com.neometrica.inventario.api.service.DestinoService;
import ve.com.neometrica.inventario.api.service.InventarioService;
import ve.com.neometrica.inventario.api.service.MarcaService;
import ve.com.neometrica.inventario.api.service.ProductoService;
import ve.com.neometrica.inventario.api.service.TransaccionService;


/**
 * Clase base de los jsf backing-beans de administracion de entidades
 * 
 * @author v.velastiqui
 */
public class AdministrarBean extends MultipleModeContainerBean implements
		Serializable {

	private static final long serialVersionUID = 180524667496981339L;
	private static final Logger LOG = Logger.getLogger(AdministrarBean.class);
	private static ResourceBundle bundle = null;
	private boolean mostrarMensajeFatalNotification = false;
	private boolean mostrarMensajeWarnningNotificacion = false;
	private String textoMensaje;
	private static final String SI = "S";
	private static final String NO = "N";
	private String mostrarMensaje = NO;
    public static final SimpleDateFormat formatoSoloFecha=new SimpleDateFormat("dd/MM/yyyy");
    public static final DecimalFormat decimalFormat=new DecimalFormat("#.#####");
    
    
	public AdministrarBean() {
		// al crear el bean pongo una referencia en sesion para poder
		// refernciarlo gen�ricmante en un include que es usado por varios
		// diferentes forms con diferentes subtipos de AdministrarBean
		ExternalContext externalContext = FacesContext.getCurrentInstance()
				.getExternalContext();
		externalContext.getSessionMap().put("currentAdministrarBean", this);

	}

	public ResourceBundle getBundle() {
		if (bundle == null) {
			bundle = ResourceBundle
					.getBundle("ve/com/neometrica/inventario/web/config/properties/messages");
		}
		return bundle;
	}

	/**
	 * busca en el archivo de mensajes (.properties), el mensaje de
	 * FatalNotification o WarnningNotificacion para mostrarlo en un component
	 * panel.
	 * 
	 * @param key
	 * @return
	 */
	public String verMensaje(String key) {
		ResourceBundle bundle = this.getBundle();
		String message;

		try {
			message = (String) bundle.getObject(key);
		} catch (MissingResourceException ex) {
			message = "Se produjo un error. Motivo: " + key;
		}

		return message;
	}

	/**
	 * Agrega mensaje a las paginas jspx
	 * 
	 * @param field
	 * @param key
	 */
	protected FacesMessage addMessage(String field, String key) {

		String message;

		try {
			message = (String) this.verMensaje(key);
		} catch (MissingResourceException ex) {
			message = "Se produjo un error. Motivo: " + key;
		}
		FacesMessage facesMessage = new FacesMessage(message);

		FacesContext.getCurrentInstance().addMessage(field, facesMessage);

		return facesMessage;
	}

	protected void mostrarNotificacionError() {
		// lo pone en sesion para el jspx de notificacion
		resetMostrarNotificacion();
		getSessionBean().setMostrarMensajeError(Boolean.TRUE);
	}

	protected void resetNotificacionError() {
		// lo pone en sesion para el jspx de notificacion
		getSessionBean().setMostrarMensajeError(Boolean.FALSE);
	}

	protected void mostrarNotificacionConfirmacion() {
		// lo pone en sesion para el jspx de notificacion
		resetMostrarNotificacion();
		getSessionBean().setMostrarMensajeOk(Boolean.TRUE);
	}

	protected void mostrarNotificacion(boolean isFatal, String notifMessage) {
		setMostrarMensaje(SI);
		setMostrarMensajeFatalNotification(isFatal);
		setMostrarMensajeWarnningNotificacion(!isFatal);
		setTextoMensaje(notifMessage);
		AdministrarBean.getSessionBean().getAtributosSession()
				.put("mostrarMensaje", new Boolean(true));
		AdministrarBean.getSessionBean().getAtributosSession()
				.put("mensajeNotif", notifMessage);
	}

	public void resetNotificacionConfirmacion() {
		// lo pone en sesion para el jspx de notificacion
		AdministrarBean.getSessionBean().setMostrarMensajeOk(Boolean.FALSE);
	}

	public static void resetMostrarNotificacion() {
		// lo pone en sesion para el jspx de notificacion
		LOG.info("resetMostrarNotificacion");
		AdministrarBean.getSessionBean().setMostrarMensajeOk(Boolean.FALSE);
		AdministrarBean.getSessionBean().setMostrarMensajeError(Boolean.FALSE);
		Iterator<FacesMessage> msgIterator = FacesContext.getCurrentInstance()
				.getMessages();
		while (msgIterator.hasNext()) {
			msgIterator.next();
			msgIterator.remove();
		}
	}


	public void logMensaje(String mensaje) {
		LOG.info(mensaje);
	}

	/**
	 * @param event
	 *            Este metodo es para que el resetMostrarNotificacion pueda ser
	 *            llamado como un actionListener
	 */
	// si lo pongo como protected no lo reconoce al metodo
	public void resetMostrarNotificacion(ActionEvent event) {
		this.resetMostrarNotificacion();
	}

	
	

	/**
	 * Get <code>SessionBean</code>.
	 * <p>
	 * Specific for this applicaiton.
	 * 
	 * @return the session bean
	 */
	public static SessionBean getSessionBean() {
		return (SessionBean) UtilFaces.getManagedBean("sessionBean");
	}

	/**
	 * Metodo que setea un atributo en session
	 * 
	 * @param key
	 *            clave con el se seteara el objeto en session
	 */
	public static void setObjSession(String key, Object value) {
		AdministrarBean.getSessionBean().getAtributosSession().put(key, value);
	}

	protected void defineOutcomes() {
	}

		
	/**
	 * @return the mostrarMensajeFatalNotification
	 */
	public boolean isMostrarMensajeFatalNotification() {
		return mostrarMensajeFatalNotification;
	}

	/**
	 * @param mostrarMensajeFatalNotification
	 *            the mostrarMensajeFatalNotification to set
	 */
	public void setMostrarMensajeFatalNotification(
			boolean mostrarMensajeFatalNotification) {
		this.mostrarMensajeFatalNotification = mostrarMensajeFatalNotification;
	}

	/**
	 * @return the mostrarMensajeWarnningNotificacion
	 */
	public boolean isMostrarMensajeWarnningNotificacion() {
		return mostrarMensajeWarnningNotificacion;
	}

	/**
	 * @param mostrarMensajeWarnningNotificacion
	 *            the mostrarMensajeWarnningNotificacion to set
	 */
	public void setMostrarMensajeWarnningNotificacion(
			boolean mostrarMensajeWarnningNotificacion) {
		this.mostrarMensajeWarnningNotificacion = mostrarMensajeWarnningNotificacion;
	}

	
	// public ResPermisoAsignacionUsoComplementarioService
	// getSolPermisoAsignacionUsoComplementarioService() {
	// return (ResPermisoAsignacionUsoComplementarioService)
	// getService("solPermisoAsignacionUsoComplementarioService");
	// }

	
	/**
	 * @return the textoMensaje
	 */
	public String getTextoMensaje() {
		return textoMensaje;
	}

		
		/**
	 * @param textoMensaje
	 *            the textoMensaje to set
	 */
	public void setTextoMensaje(String textoMensaje) {
		this.textoMensaje = textoMensaje;
	}

	/**
	 * @return the mostrarMensaje
	 */
	public String getMostrarMensaje() {
		return mostrarMensaje;
	}

	/**
	 * @param mostrarMensaje
	 *            the mostrarMensaje to set
	 */
	public void setMostrarMensaje(String mostrarMensaje) {
		this.mostrarMensaje = mostrarMensaje;
	}

	/**
	 * @return the si
	 */
	public static String getSi() {
		return SI;
	}

	/**
	 * @return the no
	 */
	public static String getNo() {
		return NO;
	}
	
	public boolean generarOk(FacesContext facesContext, String message) {
		// obtener string del key

		FacesMessage mensaje = new FacesMessage(getBundle().getString(message),
				getBundle().getString(message));
		mensaje.setSeverity(FacesMessage.SEVERITY_INFO);
		facesContext.addMessage(null, mensaje);
		return true;
	}

	public boolean generarOk(String message) {
		return generarOk(UtilFaces.getFacesContex(), message);
	}
	/**
	 * 
	 */
	public void setMensajeOkTrue(ActionEvent event){
		getSessionBean().setMostrarMensajeOk(Boolean.FALSE);
	}
	public ProductoService getProductoService(){
		return (ProductoService)getBean("productoService");
	}
	public MarcaService getMarcaService(){
		return (MarcaService)getBean("marcaService");
	}
	public InventarioService getInventarioService(){
		return (InventarioService)getBean("inventarioService");
	}
	public DestinoService getDestinoService(){
		return (DestinoService)getBean("destinoService");
	}
	public TransaccionService getTransaccionService(){
		return (TransaccionService)getBean("transaccionService");
	}
}
